home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / nan_news / toolkit / workdays.prg < prev    next >
Text File  |  1991-08-15  |  3KB  |  96 lines

  1. /*
  2.  * File......: WORKDAYS.PRG
  3.  * Author....: John F. Kaster
  4.  * CIS_ID....: 71510,3321
  5.  * Date......: $Date:   15 Aug 1991 23:05:48  $
  6.  * Revision..: $Revision:   1.1  $
  7.  * Log file..: $Logfile:   E:/nanfor/src/workdays.prv  $
  8.  * 
  9.  * The functions contained herein are the original work of John Kaster
  10.  * and are placed in the public domain.
  11.  *
  12.  * Modification history:
  13.  * ---------------------
  14.  *
  15.  * $Log:   E:/nanfor/src/workdays.prv  $
  16.  * 
  17.  *    Rev 1.1   15 Aug 1991 23:05:48   GLENN
  18.  * Forest Belt proofread/edited/cleaned up doc
  19.  * 
  20.  *    Rev 1.0   12 Jun 1991 01:33:10   GLENN
  21.  * Initial revision.
  22.  *
  23.  */
  24.  
  25. /*  $DOC$
  26.  *  $FUNCNAME$
  27.  *     FT_WORKDAYS()
  28.  *  $CATEGORY$
  29.  *     Date/Time
  30.  *  $ONELINER$
  31.  *     Return number of work days between two dates
  32.  *  $SYNTAX$
  33.  *     FT_WORKDAYS( [ <dStart> ], [ <dStop> ] ) -> nDays
  34.  *  $ARGUMENTS$
  35.  *     <dStart> is the beginning value for the date range.
  36.  *
  37.  *     <dStop> is the ending value for the date range.
  38.  *
  39.  *  $RETURNS$
  40.  *     The number of work days (Monday through Friday) between two dates.
  41.  *
  42.  *  $DESCRIPTION$
  43.  *     FT_WORKDAYS() returns a number indicating the number of work days
  44.  *     between two dates.  Work days are considered Monday through Friday.
  45.  *         (The five day work week none of us Clipper programmers have.)
  46.  *
  47.  *  $EXAMPLES$
  48.  *    ? FT_WorkDays( CTOD("5/16/91"), CTOD("5/20/91") ) // 3  (Th - Mo)
  49.  *    ? FT_WorkDays( CTOD("5/18/91"), CTOD("5/19/91") ) // 0  (Sa - Su)
  50.  *    ? FT_WorkDays( CTOD("5/17/91"), CTOD("5/17/91") ) // 1  (Fr - Fr)
  51.  *  $SEEALSO$
  52.  *  $END$
  53. */
  54.  
  55.  
  56. FUNCTION FT_WorkDays( dStart, dStop )
  57.   LOCAL nWorkDays := 0, nDays, nAdjust
  58.  
  59.   IF dStart # NIL .AND. dStop # NIL
  60.        IF dStart # dStop
  61.         IF dStart > dStop   // Swap the values
  62.             nAdjust    := dStop
  63.             dStop    := dStart
  64.             dStart    := nAdjust
  65.         ENDIF
  66.  
  67.         IF ( nDays := Dow( dStart ) ) == 1 // Sunday (change to next Monday)
  68.            dStart++
  69.         ELSEIF nDays == 7 // Saturday (change to next Monday)
  70.            dStart += 2
  71.         ENDIF
  72.          
  73.         IF ( nDays := Dow( dStop ) ) == 1 // Sunday (change to prev Friday)
  74.            dStop -= 2
  75.         ELSEIF nDays == 7 // Saturday (change to prev Friday)
  76.            dStop--
  77.         ENDIF
  78.          
  79.         nAdjust := ( nDays := dStop - dStart + 1 ) % 7
  80.          
  81.         IF Dow( dStop ) < Dow( dStart ) // Weekend adjustment
  82.            nAdjust -= 2
  83.         ENDIF
  84.          
  85.         nWorkDays := Int( nDays / 7 ) * 5 + nAdjust
  86.  
  87.       ELSEIF ( Dow( dStart ) # 1 .AND. Dow( dStart ) # 7 )
  88.  
  89.          nWorkDays := 1
  90.  
  91.       ENDIF
  92.  
  93.    ENDIF
  94.  
  95. RETURN ( IIF(nWorkDays>0,nWorkDays,0) )
  96.